#pragma once

#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void MyDaemon()
{
    // 1. 忽略信号，SIGPIPE，SIGCHLD
    signal(SIGPIPE, SIG_IGN);
    signal(SIGCHLD, SIG_IGN);

    // 2. 不要让自己成为进程组组长
    if (fork() > 0) exit(0); // 父进程直接终止
    // 那子进程就一定不是组长

    // 3. 调用setsid
    setsid();

    // 4. 标准输入、输出、错误的重定向，它已经是一个独立的进程了，所以不能再向显示器打印
    int devnull = open("/dev/null", O_RDONLY | O_WRONLY);
    if (devnull > 0)
    {
        dup2(devnull, 0);
        dup2(devnull, 1);
        dup2(devnull, 2);
        close(devnull);
    }
}